#!/bin/bash

# 检查参数数量是否正确
if [ $# -ne 2 ]; then
    echo "用法: $0 \"原字符串\" \"替换字符串\""
    echo "示例: $0 'oldFunc' 'newFunc'"
    exit 1
fi

OLD_STR="$1"
NEW_STR="$2"

# 定义需要排除的目录（可根据实际需求增删）
EXCLUDE_DIRS=(
    .git
    .svn
    node_modules
    vendor
    dist
    build
)

# 构建find命令的排除参数
EXCLUDE_OPTS=""
for dir in "${EXCLUDE_DIRS[@]}"; do
    EXCLUDE_OPTS+=" -path ./$dir -o"
done
# 移除最后一个多余的 -o
EXCLUDE_OPTS="${EXCLUDE_OPTS% -o}"

echo "开始在所有.go文件中替换字符串: '$OLD_STR' -> '$NEW_STR'"
echo "排除目录: ${EXCLUDE_DIRS[*]}"
echo "----------------------------------------"

# 递归查找所有.go文件并执行替换
# 使用|作为sed分隔符，避免与字符串中的/冲突
# 仅处理普通文件(-type f)且后缀为.go(-name "*.go")
find . \( $EXCLUDE_OPTS \) -prune -o -type f -name "*.go" -exec sed -i.bak "s|$OLD_STR|$NEW_STR|g" {} +

# 清理sed生成的备份文件（如果需要保留备份，可删除此行）
find . -name "*.go.bak" -delete

echo "----------------------------------------"
echo "替换完成！已处理所有.go文件"
